/*
 * This file contains some defines for the AT-hd-controller.
 * Various sources. Check out some definitions (see comments with
 * a ques).
 */
/*
 * 本文件含有一些AT硬盘控制器的定义.来自各种资料.请查证某些定义(带有问号的注释).
 */
#ifndef _HDREG_H
#define _HDREG_H

/* Hd controller regs. Ref: IBM AT Bios-listing */
/* 硬盘控制器寄存器端口. */
#define HD_DATA		0x1f0			/* _CTL when writing */				/* 数据寄存器--扇区数据（读、写、格式化）*/
#define HD_ERROR	0x1f1			/* see err-bits */					/* 错误寄存器（错误状态）(HD_ERROR) */
#define HD_NSECTOR	0x1f2			/* nr of sectors to read/write */	/* 扇区数寄存器--扇区数（读、写、检验、格式化）*/
#define HD_SECTOR	0x1f3			/* starting sector */				/* 扇区号寄存器--起始扇区（读、写、检验）*/
#define HD_LCYL		0x1f4			/* starting cylinder */				/* 柱面号寄存器--柱面号低字节（读、写、检验、格式化）*/
#define HD_HCYL		0x1f5			/* high byte of starting cyl */		/* 柱面号寄存器--柱面号高字节（读、写、检验、格式化）*/
#define HD_CURRENT	0x1f6			/* 101dhhhh , d=drive, hhhh=head */	/* 驱动器/磁头寄存器--驱动器号/磁头号(101dhhhh, d=驱动器号,h=磁头号) */
#define HD_STATUS	0x1f7			/* see status-bits */				/* 主状态寄存器 (HD_STATUS) */
#define HD_PRECOMP HD_ERROR			/* same io address, read=error, write=precomp */	/* 写前预补偿寄存器 (HD_PRECOMP) */
#define HD_COMMAND HD_STATUS		/* same io address, read=status, write=cmd */		/* 命令寄存器--当执行写操作时，它接受 CPU 发出的硬盘控制命令 (HD_COMMAND) */

#define HD_CMD		0x3f6			// 硬盘控制寄存器 (HD_CMD)-CPU 向控制寄存器端口 (HD_CMD)0x3f6 输出控制字节，建立相应的硬盘控制方式

/* Bits of HD_STATUS */
/* 硬盘状态寄存器各位的定义(HD_STATUS) */
#define ERR_STAT	0x01			// 命令执行错误.
#define INDEX_STAT	0x02			// 收到索引.
#define ECC_STAT	0x04			/* Corrected error */	// ECC校验错.
#define DRQ_STAT	0x08			// 请求服务.
#define SEEK_STAT	0x10			// 寻道结束.
#define WRERR_STAT	0x20			// 驱动器故障.
#define READY_STAT	0x40			// 驱动器准备好(就绪).
#define BUSY_STAT	0x80			// 控制器忙碌.

/* Values for HD_COMMAND */
/* 硬盘命令值(HD_COMMAND) */
#define WIN_RESTORE		0x10		// 驱动器重新校正(驱动器复位).
#define WIN_READ		0x20		// 读扇区
#define WIN_WRITE		0x30		// 写扇区
#define WIN_VERIFY		0x40		// 扇区检验
#define WIN_FORMAT		0x50		// 格式化磁道
#define WIN_INIT		0x60		// 控制器初始化
#define WIN_SEEK 		0x70		// 寻道
#define WIN_DIAGNOSE	0x90		// 控制器诊断
#define WIN_SPECIFY		0x91		// 建立驱动器参数

/* Bits for HD_ERROR */
/* 错误寄存器各位的含义(HD_ERROR) */
// 执行控制器诊断时含义与其他命令时的不同.下面分别列出:
// ============================================================
//        诊断命令时                其他命令时
// ------------------------------------------------------------
// 0x01     无错误                数据标志丢失
// 0x02     控制器出错             磁道0错
// 0x03     扇区缓冲区错
// 0x04     ECC部件错             命令放弃
// 0x05     控制处理器错
// 0x10                          ID未找到
// 0x40                          ECC错误
// 0x80                          坏扇区
// ------------------------------------------------------------
#define MARK_ERR	0x01	/* Bad address mark ? */
#define TRK0_ERR	0x02	/* couldn't find track 0 */
#define ABRT_ERR	0x04	/* ? */
#define ID_ERR		0x10	/* ? */
#define ECC_ERR		0x40	/* ? */
#define	BBD_ERR		0x80	/* ? */

// 硬盘分区表结构.
// 参考：https://baike.baidu.com/item/硬盘分区表/108750
struct partition {
	unsigned char boot_ind;		// 0x80活动分区、0x00非活动分区
	unsigned char head;			// 磁头号
	unsigned char sector;		// 扇区号（当前字节的低6位）
	unsigned char cyl;			// 柱面号（上一个字节的高2位和本字节的8位）
	unsigned char sys_ind;		// 分区位系统标志（0x00分区未使用、0x05或0x0x0f扩展分区、0x06FAT16分区、0x07NTFS分区）
	unsigned char end_head;		// 分区的结束磁头号
	unsigned char end_sector;	// 分区的结束扇区号
	unsigned char end_cyl;		// 分区结束柱面号
	unsigned int start_sect;	// 逻辑起始扇区号之差（如果是主分区：表示当前扇区LBA与0扇区之差，如果是逻辑扇区表示：当前扇区号LBA与扩展扇区LBA之差）
	unsigned int nr_sects;		// 分区占用的扇区数
};

#endif
